package com.Algorithm.HUAWEI.two20220303;

import javax.swing.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Parameter;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: zjz
 * @Date: 2022/03/22/17:24
 * @Description:
 * @Target:
 */
public class 判断两个IP是否属于同一子网 {
    /*
    *
    * 描述
        IP地址是由4个0-255之间的整数构成的，用"."符号相连。
        二进制的IP地址格式有32位，例如：10000011，01101011，00000011，00011000;每八位用十进制表示就是131.107.3.24
        子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
        子网掩码与IP地址结构相同，是32位二进制数，由1和0组成，且1和0分别连续，其中网络号部分全为“1”和主机号部分全为“0”。
        你可以简单的认为子网掩码是一串连续的1和一串连续的0拼接而成的32位二进制数，左边部分都是1，右边部分都是0。
        利用子网掩码可以判断两台主机是否中同一子网中。
        若两台主机的IP地址分别与它们的子网掩码进行逻辑“与”运算（按位与/AND）后的结果相同，则说明这两台主机在同一子网中。

        示例：
        I P 地址　 192.168.0.1
        子网掩码　 255.255.255.0

        转化为二进制进行运算：

        I P 地址　  11000000.10101000.00000000.00000001
        子网掩码　11111111.11111111.11111111.00000000

        AND运算   11000000.10101000.00000000.00000000

        转化为十进制后为：
        192.168.0.0


        I P 地址　 192.168.0.254
        子网掩码　 255.255.255.0


        转化为二进制进行运算：

        I P 地址　11000000.10101000.00000000.11111110
        子网掩码  11111111.11111111.11111111.00000000

        AND运算  11000000.10101000.00000000.00000000

        转化为十进制后为：
        192.168.0.0

        通过以上对两台计算机IP地址与子网掩码的AND运算后，我们可以看到它运算结果是一样的。均为192.168.0.0，所以这二台计算机可视为是同一子网络。

        输入一个子网掩码以及两个ip地址，判断这两个ip地址是否是一个子网络。
        若IP地址或子网掩码格式非法则输出1，若IP1与IP2属于同一子网络输出0，若IP1与IP2不属于同一子网络输出2。

        注:
        有效掩码与IP的性质为：
        1. 掩码与IP每一段在 0 - 255 之间
        2. 掩码的二进制字符串前缀为网络号，都由‘1’组成；后缀为主机号，都由'0'组成

        输入描述：
        3行输入，第1行是输入子网掩码、第2，3行是输入两个ip地址
        题目的示例中给出了三组数据，但是在实际提交时，你的程序可以只处理一组数据（3行）。

        输出描述：
        若IP地址或子网掩码格式非法则输出1，若IP1与IP2属于同一子网络输出0，若IP1与IP2不属于同一子网络输出2
    *
    *
    * */


    public static void main(String[] args) throws IOException {
        /*若IP地址或子网掩码格式非法则输出1，若IP1与IP2属于同一子网络输出0，若IP1与IP2不属于同一子网络输出2*/
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        process(in.readLine(),in.readLine(),in.readLine());

    }


    // 因为要进&运算，所以得转换为二进制，分四段再合并运行。
    static void process(String ss1,String ss2,String ss3){
        String[] split1 = ss1.split("\\.");
        String[] split2 = ss2.split("\\.");
        String[] split3 = ss3.split("\\.");

        if (!check0255(split1)||!check0255(split2)||!check0255(split3)){
            System.out.println("1");
            return;
        }

        StringBuffer stringBuffer1 = new StringBuffer();
        StringBuffer stringBuffer2 = new StringBuffer();
        StringBuffer stringBuffer3 = new StringBuffer();
        // 处理数据，将它们转换为01的格式
        for (int i = 0; i < 4; i++) {
            stringBuffer1.append(addZero(Integer.toBinaryString(Integer.valueOf(split1[i]))));
            stringBuffer2.append(addZero(Integer.toBinaryString(Integer.valueOf(split2[i]))));
            stringBuffer3.append(addZero(Integer.toBinaryString(Integer.valueOf(split3[i]))));
        }


        if (!checkYanMa(stringBuffer1.toString())){
            System.out.println("1");
            return;
        }

        boolean flag = true;
        for (int i = 0; i < stringBuffer1.length(); i++) {
            if (((stringBuffer1.charAt(i)-'0')&(stringBuffer2.charAt(i)-'0'))!=((stringBuffer1.charAt(i)-'0')&(stringBuffer3.charAt(i)-'0'))){
                System.out.println("2");
                flag = false;
                return;
            }
        }

        if (flag == true){
            System.out.println("0");
        }



    }



    // 子网掩码--要前面是1,1后就是0，使用contains判断就行
    static boolean checkYanMa(String ss){
        if (ss.contains("01")){
            return false;
        }else {
            return true;
        }
    }
    // check服务，【0,255】 true是符合，false是不符合
    static boolean check0255(String[] ss){
        boolean flag =true;
        for (int i = 0; i < ss.length; i++) {
            if ("".equals(ss[i])||ss==null||Integer.valueOf(ss[i])<0||Integer.valueOf(ss[i])>255){
                flag = false;
                break;
            }
        }

        return flag;

    }


    // 加0
    static String addZero(String ss){
        int len = 0;
        StringBuffer stringBuffer = new StringBuffer();
        if (ss.length()<32){
            len = ss.length()%8==0?8:ss.length()%8;
        }

        for (int i = 0; i < 8-len; i++) {
            stringBuffer.append("0");
        }

        stringBuffer.append(ss);

        return stringBuffer.toString();
    }
}
